package com.nageoffer.jobtrain.projects.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.nageoffer.jobtrain.common.web.result.Result;
import com.nageoffer.jobtrain.projects.dao.entity.OjQuestionDO;
import com.nageoffer.jobtrain.projects.dto.req.OjQuestionExecuteResultReqDTO;
import com.nageoffer.jobtrain.projects.dto.req.OjQuestionPageListReqDTO;
import com.nageoffer.jobtrain.projects.dto.req.OjQuestionSubmitReqDTO;
import com.nageoffer.jobtrain.projects.dto.resp.*;

import java.util.List;

/**
 * Oj题目查询接口层
 * author：唐晨
 */
public interface OjQuestionService extends IService<OjQuestionDO> {
    /**
     * OJ题目分页请求 -匹配关键词、题目难度
     *
     * @param requestParam 分页查询请求入参
     * @return 查询返回列表
     */
    OjQuestionPageListRespDTO ojQuestionPageList(OjQuestionPageListReqDTO requestParam);

    /**
     * 根据OJ题目ID，获取OJ题目详情
     *
     * @param id OJ题目ID
     * @return OJ题目详情返回实体
     */
    OjQuestionDetailRespDTO ojQuestionDetail(Long id);

    /**
     * 获取OJ题目上一题详情
     *
     * @param id 当前OJ题目ID
     * @return 上一题OJ题目ID返回实体
     */
    OjQuestionPrevDetailRespDTO ojQuestionPrevDetail(Long id);

    /**
     * 获取OJ题目下一题详情
     *
     * @param id 当前OJ题目ID
     * @return 下一题OJ题目ID返回实体
     */
    OjQuestionNextDetailRespDTO ojQuestionNextDetail(Long id);

    /**
     * 用户提交代码逻辑
     *
     * @param requestParam 提交代码请求入参
     * @return 提交代码返回响应
     */
    Result<OjQuestionSubmitRespDTO> ojQuestionSubmitCode(OjQuestionSubmitReqDTO requestParam);

    /**
     * 用户提交代码逻辑 -by rocketmq
     *
     * @param requestParam 提交代码请求入参
     */
    Void ojQuestionSubmitCodeByRocketMQ(OjQuestionSubmitReqDTO requestParam);

    /**
     * 获取用户提交判题结果
     *
     * @param requestParam 获取用户提交判题结果请求入参
     * @return 判题结果返回
     */
    OjQuestionSubmitRespDTO ojQuestionExecuteResult(OjQuestionExecuteResultReqDTO requestParam);

    /**
     * 获取OJ题目热榜排行列表
     *
     * @return 热榜排行列表响应
     */
    List<String> ojQuestionHotList();

    /**
     * 查询用户已通过的OJ题目列表ID
     */
    List<Long> ojQuestionUserPassList();
}
